home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
tvmouse.exe
/
IBMMOUSE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-03
|
6KB
|
317 lines
/*
* IBMMOUSE.C
*
* COPYRIGHT : 1990 Echidna.
* PROGRAMMER : Gregg A. Tavares
* VERSION : 00.000
* CREATED : 07/09/90
* MODIFIED : 01/03/93
* TABS : 05 09
*
* \|///-_
* \oo///_
* -----w/-w------
* E C H I D N A
* ---------------
*
* DESCRIPTION
* IBM Mouse Glue modified from original code by Dan Chang.
*
* HISTORY
*
*/
#include <stdio.h>
#include <dos.h>
#include "mouse.h"
/**************************** C O N S T A N T S ***************************/
#define MOUSE_INT 0x33
#define TRUE 1
#define FALSE 0
/******************************** T Y P E S *******************************/
typedef struct {
unsigned char Char;
unsigned char Attr;
} ScreenElem;
/****************************** G L O B A L S *****************************/
static void interrupt (*oldvect)(void);
static ScreenElem OldData;
static ScreenElem *MouseScreen;
static short inside;
static short ShowCount = 0;
static short OldShowCount = 0;
static short MSIntHndl;
static short MouseX;
static short MouseY;
static short MouseButtons;
static short MouseXMin = 0;
static short MouseXRange = 80;
static short MouseYMin = 0;
static short MouseYRange = 25;
static short MouseXRes = 640;
static short MouseYRes = 200;
static short OldMouseX;
static short OldMouseY;
static short MouseScrnWidth = 80;
static short MouseScrnHeight = 25;
static short RestoreState = 0;
/******************************* M A C R O S ******************************/
/***************************** R O U T I N E S ****************************/
#if 0
INT 33 - MS MOUSE - READ MOTION COUNTERS
AX = 000Bh
Return: CX = number of mickeys mouse moved horizontally since last call
DX = number of mickeys mouse moved vertically
Notes: a mickey is the smallest increment the mouse can sense
positive values indicate down/right
SeeAlso: AX=0003h,AX=001Bh
#endif
#if __TURBOC__
#pragma option -N-
#pragma option -r-
#endif
static void RestoreMouseArea (void)
{
if (RestoreState)
{
RestoreState = FALSE;
MouseScreen[OldMouseY * MouseScrnWidth + OldMouseX] = OldData;
}
}
static interrupt void MouseInterrupt (void)
{
if (!inside)
{
short mouseOn;
inside = TRUE;
{
union REGS regs;
regs.x.ax = 0x03;
int86(MOUSE_INT, ®s, ®s);
MouseButtons = regs.x.bx & 0x03;
regs.x.ax = 0x0B;
// regs.x.ax = 0x27;
int86(MOUSE_INT, ®s, ®s);
MouseX += (short)regs.x.cx;
MouseY += (short)regs.x.dx;
if (MouseX < 0) MouseX = 0;
if (MouseX >= MouseXRes) MouseX = MouseXRes - 1;
if (MouseY < 0) MouseY = 0;
if (MouseY >= MouseYRes) MouseY = MouseYRes - 1;
}
mouseOn = ShowCount > 0;
if (mouseOn)
{
short x;
short y;
short oldMouseOn;
short doit0;
short doit2;
short doit3;
x = ((long)MouseX * MouseScrnWidth / MouseXRes)
y = ((long)MouseY * MouseScrnHeight / MouseYRes)
oldMouseOn = OldShowCount > 0;
doit0 = mouseOn != oldMouseOn;
doit2 = x != OldMouseX;
doit3 = y != OldMouseY;
if (doit0 || doit2 || doit3)
{
RestoreMouseArea ();
//
// Save Area
//
OldData = MouseScreen[y * MouseScrnWidth + x];
RestoreState = TRUE;
//
// Draw Mouse
//
MouseScreen[y * MouseScrnWidth + x].Attr ^= 0x7F;
//
// Save old position
//
OldMouseX = x;
OldMouseY = y;
}
}
OldShowCount = ShowCount;
inside = FALSE;
}
oldvect ();
}
void ShowMouse(void)
{
if (!inside)
{
#if 0
ShowCount++;
#else
OldShowCount = 0;
ShowCount = 1;
#endif
}
}
void HideMouse(void)
{
if (!inside)
{
#if 0
ShowCount--;
if (!ShowCount) {
RestoreMouseArea ();
OldShowCount = 0;
}
#else
RestoreMouseArea ();
OldShowCount = 0;
ShowCount = 0;
#endif
}
}
void ReadMouse(MouseInfo *m)
{
m->X = MouseXMin + (long)MouseX * (long)MouseXRange / MouseXRes;
m->Y = MouseYMin + (long)MouseY * (long)MouseYRange / MouseYRes;
m->OldButtons = m->Buttons;
m->Buttons = MouseButtons;
}
#if __TURBOC__
#pragma option -r.
#pragma option -N.
#endif
void SetMousePosition (short x, short y)
{
MouseX = (long)(x - MouseXMin) * MouseXRes / MouseXRange;
MouseY = (long)(y - MouseYMin) * MouseYRes / MouseYRange;
}
void SetMouseResolution (short xres, short yres)
{
MouseXRes = xres;
MouseYRes = yres;
}
void SetMouseRange (short xmin, short xmax, short ymin, short ymax)
{
MouseXMin = xmin;
MouseYMin = ymin;
MouseXRange = xmax - xmin + 1;
MouseYRange = ymax - ymin + 1;
}
void SetMouseScreenDimensions (short width, short height)
{
MouseScrnWidth = width;
MouseScrnHeight = height;
}
short OpenMouse(void)
{
union REGS regs;
unsigned char far *hMouse;
short result = FALSE;
if (MSIntHndl)
{
puts ("Error: Mouse already open");
}
MouseScreen = MK_FP (0xB800, 0x0000);
regs.x.ax = 0x00;
if ((hMouse = *(unsigned char * far *) MK_FP(0x0, MOUSE_INT*4)) == 0) {
puts ("\nMouse Driver not found");
return FALSE;
}
if (*hMouse == 0xCF /* IRET */) {
puts ("\nMouse Driver not found");
return FALSE;
}
int86(MOUSE_INT, ®s, ®s);
result = (regs.x.ax == (unsigned int)(-1));
if (result)
{
oldvect = getvect (0x08);
setvect (0x08, MouseInterrupt);
MSIntHndl = TRUE;
if (MSIntHndl) {
return TRUE;
}
CloseMouse ();
}
return FALSE;
}
void CloseMouse (void)
{
if (!MSIntHndl)
{
puts ("Error: Mouse not installed");
}
{
if (MSIntHndl) setvect (0x08, oldvect);
MSIntHndl = 0;
{
union REGS regs;
regs.x.ax = 0x00;
int86(MOUSE_INT, ®s, ®s);
}
}
}